link.xml製造機
概要
UnityでのWebGLビルドはまだまだまだまだyack。今一歩。二歩、三歩。
UnityでWebGLビルドするのをリモートのマシンでガンガン回してたけど1分切るかどうかって感じで切ないのでボリュームゾーンだけ最適化を試みる。
strip engine code
で、strip engine codeのチェックを入れると、不要なUnityEngineのコードが根こそぎ消える。のでこれを使いたいが、
そのままだと実行時必要なコードももちろんないので、最低限必要なものをlink.xmlに書くことになる。
で、classIdからclass引くのが面倒なので、classId入れたらlink.xml吐くのを作った
これ。好きにして。
https://github.com/sassembla/UniCMS/blob/master/Assets/Backyard/Editor/ClassIdCollector.cs
メニュー項目を一個自作して適宜ぶっ叩くといいと思う。
例:
https://github.com/sassembla/UniCMS/blob/master/Assets/Backyard/Editor/Publisher.cs
[MenuItem ("UniCMS/Generate link.xml")]
static void GenerateLinkXML () {
var classIds = new List<int>{223, 108};
ClassIdCollector.ExportLinkXMLWithUsingClassIds(classIds);
}
ほぼ手動。この辺Unityが進歩していく過程で自動化されるに決まってて夢はない。
ただし面倒臭い手動の部分をどう単純化 + 自動化するかが楽をするためのコツなんでその辺。
ここから先は、UnityのWebGLの出力最適化に関するメモ。
strip engine code on/off時の動作
単純に、コンパイルから全ての未使用のunity engine codeを消すか否か。
BuildSettingsのWebGLのこのチェックが付いていると、build resultから全ての未使用のUnityEngineがらみのコードが消える。
ビルドは最速、生成されるjsも2.3MB程度になる。
ちなみにUnityEngineがらみ以外のものは入るんで、すべてのUnityEngineがらみのものを使わないで書けばそれはそれでいいような気がする。
Webブラウザのjsコンソールで動くゲームとか。なにそれ。
で、strip engine codeがonの時、UnityEngineの機能(GUIとか、Unity2DのCanvasとか)を使用しようとすると、実行時に次のようなエラーが出る。
Could not produce class with ID 223.
This could be caused by a class being stripped from the build even though it is needed. Try disabling 'Strip Engine Code' in Player Settings.
うん、class with ID 223ってのがないんだね。なんだよそれっていう。
ようはUnityEngineのコードをstripしきっているんでゲーム内で使ってるコードもないですよっていうやつ。
対象のclass with ID 223 っていうのを個別にjs変換に巻き込むことで対応できる。
こういうのBackgroundで動かしておいてくれると嬉しいんだけど。
Unityのドキュメントの方にも「どや? 辛いやろ?? 辛いよな??? 頑張るから」みたいに書いてあるんで、
多分そうなっていくんだろうな。
差
あくまで目安として。
build time size
strip on 100% 2.3MB
strip off 133% 5.2MB
link.xmlの効果の実験
単にビルド速度 vs 規模みたいな感じで、Assets直下にlink.xmlを書くと特定のクラスだけを読み込んで変換してくれる。
で、linkに書く内容の量と時間の伸びが以下
build time size
strip on 100% 2.3MB
link * 3 100% 2.3MB
link * 10 121% 4.3MB
strip off 133% 5.2MB
すっごくキレイにlinkする数を足すとビルド時間とサイズが増えていく。
実際にはビルド時間の誤差がそれなりにあるんで正しく比例するもんでもないと思う。
どのclassを読み込むかで違ってくると思うし適当すぎるclass選択してるんで全く正しくないと思うが、
まーー小さくしたほうが楽だ。GUI系のコードはわりと軽い傾向がある気がするんで嬉しい。
ちなみにビルドごとにキャッシュが効くのでは??って思ったが、
全然そんなことないからなこれ。Scalaのコンパイルのほうが速い(Cleanした後どうこうとは言ってない
ちなみに5.4 betaでは
b4でも特に何にも変わってません。速度も内容もサイズも。
まあいいや。
Unity使ってWeb作るのの30%くらいはUIが面倒臭いからなんで、そこが許容できるかどうか。あとは構造化と自動化とメンテナビリティ。
動的なクラスの追加
なんとかしたい、、、、なんとかならないかな、、、